package chapter11;

import redis.clients.jedis.Jedis;

/**
 * LuaLimitByCountThread 类继承自 Thread 类，用于演示如何通过 Redis 限流
 * 它在每个线程中检查是否可以访问某个资源，基于计数的限流策略
 */
public class LuaLimitByCountThread extends Thread {
    /**
     * 程序的入口点
     * 它创建并启动多个 LuaLimitByCountThread 线程，以演示多线程环境下的限流效果
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 循环 3 次，创建并启动 3 个线程
        for (int i = 0; i < 3; i++) {
            new LuaLimitByCountThread().start();
        }
    }

    /**
     * 线程的入口点
     * 它创建一个 Jedis 实例来与 Redis 通信，并循环检查当前线程是否可以访问资源
     *
     * @see Thread#run()
     */
    @Override
    public void run() {
        // 创建 Jedis 实例，连接到本地 Redis 服务器
        Jedis jedis = new Jedis("localhost");
        // 循环 5 次，检查是否可以访问资源
        for (int i = 0; i < 5; i++) {
            // 调用 LimitByCount 的 canVisit 方法，判断当前线程是否可以访问资源
            boolean canVisit = LimitByCount.canVisit(jedis, Thread.currentThread().getName(), 10, 3);
            // 根据 canVisit 的结果，打印是否可以访问
            if (canVisit) {
                System.out.println(Thread.currentThread().getName() + " can visit");
            } else {
                System.out.println(Thread.currentThread().getName() + " can not visit");
            }
        }
    }
}
